package com.filldream.fastboot.common.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.filldream.fastboot.common.constant.FinalStr;
import lombok.Data;
import org.slf4j.MDC;
import java.util.HashMap;
import java.util.Map;

/**
 * 基本返回类
 * @author RickSun
 * @see 3.0
 * 2019-03-22 15:56
 */
@Data
public class B {

    /** 错误码(供前后端)  */
    protected int code;

    /** 返回信息(供前端)  */
    protected String msg;

    /** 返回信息(英文，供前端)  */
    protected String enmsg;

    /** 具体错误(供后端) 特定环境可见，详见ErrorHandler类中的showSqlExceptionActive */
    protected String errmsg;

    public String getRequestId() {
        return MDC.get(FinalStr.requestId);
    }

    protected String requestId;

    /** 自定义信息 */
    protected HashMap<String, Object> otherMap;


    /**
     * 空参构造器
     */
    public B(){}

    /**
     * 指定构造器
     * @param code  错误码
     * @param msg   返回信息
     * @param enmsg 返回信息英文
     */
    public B(int code, String msg, String enmsg){
        this.code=code;
        this.msg=msg;
        this.enmsg =enmsg;
        this.errmsg = msg;
    }

    /**
     * 指定构造器
     * @Param [code-错误码, msg-返回信息, enmsg-返回信息英文, errmsg-具体错误]
     * @return 
     **/
    public B(int code, String msg, String enmsg, String errmsg){
        this.code=code;
        this.msg=msg;
        this.enmsg =enmsg;
        this.errmsg = errmsg;
    }

    /**
     * 指定构造器
     * @param code 错误码
     * @param msg 返回信息
     */
    public B(int code, String msg){
        this.code=code;
        this.msg=msg;
        this.enmsg =null;
        this.errmsg = msg;
    }


    /**
     * 默认错误码返回
     * @param errContent 错误码
     * @return
     */
    public static B create(ErrContent errContent){
        return new B(errContent.getCode(),errContent.getMsg(),errContent.getEnMsg());
    }

    /**
     * 默认错误码返回
     * @param errContent 错误码
     * @param msg   自定义返回信息
     * @return
     */
    public static B create(ErrContent errContent, String msg){
        return new B(errContent.getCode(),msg,errContent.getEnMsg());
    }

    /**
     * 自定义错误消息
     * @param errContent 错误编码
     * @param msg   返回信息
     * @param errmsg    具体错误
     * @return
     */
    public static B create(ErrContent errContent, String msg, String errmsg){
        return new B(errContent.getCode(),msg,errContent.getEnMsg(),errmsg);
    }

    /**
     * 自定义错误消息
     * @param errContent 错误码
     * @param errmsg    具体错误
     * @return
     */
    public static B createErrMsg(ErrContent errContent, String errmsg){
        return new B(errContent.getCode(),errContent.getMsg(),errContent.getEnMsg(),errmsg);
    }

    /**
     * 默认成功
     * @return
     */
    public static B success(){
        ErrorCode errorCode = ErrorCode.SUCCESS;
        return new B(errorCode.getCode(),errorCode.getMsg(),errorCode.getEnMsg());
    }

    /**
     * 校验成功
     * @param t 布尔型
     * @return
     */
    public static B checkSuccess(Boolean t){
        return t ? B.success() : B.fail();
    }

    /**
     * 校验成功
     * @param t 数值型
     * @return
     */
    public static B checkSuccess(Integer t){
        return checkSuccess( t > 0 );
    }

    /**
     * 默认失败
     * @return
     */
    public static B fail(){
        ErrorCode errorCode = ErrorCode.FAIL;
        return new B(errorCode.getCode(),errorCode.getMsg(),errorCode.getEnMsg());
    }

    /**
     * 默认失败
     * @param msg   返回信息
     * @return
     */
    public static B fail(String msg){
        ErrorCode errorCode = ErrorCode.FAIL;
        return new B(errorCode.getCode(),msg,errorCode.getEnMsg());
    }

    /**
     * 默认失败
     * @param errContent 错误码
     * @return
     */
    public static B fail(ErrContent errContent){
        return new B(errContent.getCode(),errContent.getMsg(),errContent.getEnMsg());
    }

    /**
     * 添加自定义信息
     * @param key   键
     * @param value 值
     * @return
     */
    public B put(String key, Object value) {
        checkMap();
        this.otherMap.put(key,value);
        return this;
    }

    /**
     * 批量添加自定义信息
     * @param map
     * @return
     */
    public B putAll(Map<String, Object> map) {
        checkMap();
        this.otherMap.putAll(map);
        return this;
    }

    /**
     * 获取自定义信息
     * @param key
     * @return
     */
    public Object get(String key) {
        checkMap();
        return this.otherMap.get(key);
    }

    public void checkMap(){
        if(this.otherMap == null){
            this.otherMap = new HashMap<String,Object>(1);
        }
    }

    /**
     * 判断是否成功
     * @return  true-成功 false-失败
     */
    @JsonIgnore
    public boolean isOk(){
        return this.code == 0;
    }

    @JsonIgnore
    public Boolean getOk(){
        return null;
    }

}
